#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

#include <linux/fs.h>
#include <linux/cdev.h>

static int major = 250; // 主设备号 高 12位
static int minor = 0;   // 次设备号 低 20位
static dev_t devno;     // 设备号

static struct cdev *pcdev;

// --- 2. 实现 设备操作 --- 
// 1. open()
// 2. read()
// 3. write()
// 4. lseek()
// 5. close()

static int hello_open (struct inode *inode, struct file *filep)
{
	printk("hello_open \n");
	return 0;
}
static struct file_operations hello_ops=
{
	.owner	 = THIS_MODULE,
	.open	 = hello_open,
};

static int hello_init(void)
{
	int ret;	
	printk("Hello, world\n");
	/*****   静态 设备注册   ****/
	devno = MKDEV(major,minor); // 构建 设备号
    // 静态申请 设备             设备号 - 数量 - 设备名
	ret = register_chrdev_region(devno, 1, "hello");
	if(ret < 0)
	{
		printk("register_chrdev_region fail \n");
		return ret;
	}
    // 建立 cdev与 ops的 联系
	cdev_init(pcdev,&hello_ops);
    // 注册 设备 
	ret = cdev_add(pcdev,devno,1);
	if(ret < 0)
	{
		printk("cdev_add fail \n");
		return ret;
	}	
	return 0;
}

static void hello_exit(void)
{
    //  注销 设备
	cdev_del(pcdev);
	unregister_chrdev_region(devno,1);
	printk("Goodbye, cruel world\n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);
